package com.rock.sys.global;

import java.util.Date;

import com.eova.aop.AopContext;
import com.eova.aop.MetaObjectIntercept;
import com.eova.config.EovaConst;
import com.eova.model.MetaField;
import com.eova.model.User;
import com.jfinal.plugin.activerecord.Db;
import com.jfinal.plugin.activerecord.Record;
import com.rock.sys.config.RockConst;

import cn.hutool.core.util.IdcardUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.StrUtil;

/**
 * ROCK框架公共元对象业务拦截器，处理多租户
 * <pre>
 * 使用场景:
 * 全局业务 例:增删改查日志记录
 * 高频字段统一处理 例:create_time update_time ...
 * 其它更多高端玩法,请尽情的发挥想象吧!
 * </pre>
 * 
 * @author jadison
 *
 */
public class RockMetaIntercept extends MetaObjectIntercept {

	@Override
	public String updateBefore(AopContext ac) throws Exception {
		System.out.println("Rock公共元对象业务拦截器-修改记录");
		super.updateBefore(ac);
		
		for (MetaField f : ac.object.getFields()) {
			
			//通用规则检查
			String resRule = ceckFieldRule(f,ac.record);
			if(StrUtil.isNotBlank(resRule)) {
				return resRule;
			}
			
			//修改时间
			if (f.getEn().equals("update_time")) {
				ac.record.set("update_time", new Date());
			}
			//修改用户
			if (f.getEn().equals("update_user")) {
				ac.record.set("update_user", ac.user.getInt("id"));
			}
		}
		return null;
	}

	@Override
    public String addBefore(AopContext ac) throws Exception {
		System.out.println("Rock公共元对象业务拦截器-新增记录");
		super.addBefore(ac);
		
		User user = ac.user;
		for (MetaField f : ac.object.getFields()) {
			
			//通用规则检查
			String resRule = ceckFieldRule(f,ac.record);
			if(StrUtil.isNotBlank(resRule)) {
				return resRule;
			}
			
			//创建用户
			if (f.getEn().equals("create_user")) {
				ac.record.set("create_user", user.getInt("id"));
			}

			// 如果用户信息不为空时（APP用户未绑定时则user为空）
			if (user != null) {
				// 超级管理员不做任何租户信息设置
				if (!user.isAdmin()) {
					//所属租户
					if (f.getEn().equals("tenant_id")) {
						ac.record.set("tenant_id", Db.queryStr("select tenant_id from t_user where id=?", user.getStr("id")));
					}
				}
			} else {
				// 用户信息为空时（APP用户未绑定时则user为空），根据归属app找到租户信息
				// 当前APP，从attribute中取，PC端时为空，移动端时才有值
				String appId = ac.ctrl.getAttr(RockConst.ATTR_LOGINED_APP_ID);
				ac.record.set("tenant_id", Db.queryStr("select tenant_id from t_s_app where id=?", appId));
			}
		}
		return null;
	}
	

	/**
	 * 后台统一判断特殊的字段类型是否满足规则，例如身份证
	 * @param record 
	 */
    public String ceckFieldRule(MetaField f, Record record) throws Exception {
    	
    	String value = record.getStr(f.getEn());
    	
    	//如果值为空，则不进行规则判断，否则在允许非空时触发下列规则校验
    	if(StrUtil.isBlank(value)) {
    		return null;
    	}
    	
    	if(f.getType().equals(MetaField.TYPE_IDCARD)) {
        	//身份证规则判断
    		if(!IdcardUtil.isValidCard(value)) {
    			return "请输入有效的身份证号码";
    		};
    	} else if(f.getType().equals(MetaField.TYPE_NUM)) {
        	//数字框判断
    		if(!NumberUtil.isNumber(value)) {
    			return "请输入有效的数字";
    		};
    	}
    	
    	return null;

    }

}
